package cho114366.basic;

public class J15_Printer {
	public static void main(String[] args) {
		Printer p01 = new Printer();
		p01.print();

		InkjetPrinter p02 = new InkjetPrinter();
		p02.print();

		LaserPrinter p03 = new LaserPrinter();
		p03.print();

	}// main
}// class

// 부모 클래스
class Printer {
	private String model;
	private String maker;
	private String type;
	private int paper;
	private int remains;

	public void print() {

		System.out.println("프린터입니다!");
	}
}

// 자식클래스
class InkjetPrinter extends Printer {
	public int inkremains;

	@Override
	public void print() {
		System.out.println("잉크젯 프린터입니다!");
	}
}

class LaserPrinter extends Printer {
	public int tonerRemains;

	@Override
	public void print() {
		System.out.println("레이져프린터입니다!");
	}
}

// 잉크젯/레이저 프린터 클래스를 작성하기 위해
// extends와 implements 예약어를 사용하는 것은
// 왠지 복잡해 보임
// 또, 특정 클래스에서 사용하지 않는 메서드임에도 불구하고
// 인터페이스 규칙상 작성해야 한는 불편함도 존재
// (예, Inkjet : print(), showRemain()제공)
// (예, Laser : print()만 제공)
// 따라서, 이것을 간편하게 작성하기 위해
// 기본 클래스 개념을 도입함
// 기본 base 클래스 개념을 도입함
interface PrinterServiceV3 {
	void print();
	int showRmain(); //잔량정보 표시
}

class PrinterV3 implements PrinterServiceV3 {
	private String model;
	private String maker;
	private String type;
	private int paper;
	private int remains;

	@Override
	public void print() {

		System.out.println("프린터입니다!");
	}

	@Override
	public int showRmain() {
		
		return 100;
	}
}

class InkjetPrinterV3 extends PrinterV3 {
	@Override
	public void print() {
		System.out.println("잉크젯프린터입니다!");
	}
	@Override
	public int showRmain() {
		
		return 100;
	}
}

class LaserPrinterV3 extends PrinterV3 {
	
	//레이저 프린터에서는 제공하지 않은 기능이지만
	//인터페이스를 구현했으므로
	//어쩔 수 없이 showRemain 메서드 재정의 해야함
	//즉, 필요없지만 약속에 의해 어거지로 작성함
	@Override
	public void print() {
		System.out.println("레이져프린터입니다!");

	}
	@Override
	public int showRmain() {
		
		return 0;
	}
}

// 기본 클래스를 도입해서
// 잉크젯/레이져 프린터 클래스 작성시
// 상당히 간편함을 알 수 있음